package com.qq.文件_io_字符.io2.缓冲流.字符缓冲流;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/*
	缓冲字符输入流
	缓冲字符输入流：BufferedReader​(Reader r)

	作用：自带了8KB缓冲池，提高字符输入流读取数据的性能，除此之外多了按照行读取数据的功能
	
	为什么缓冲字符输入流可以读一行readLine？
	因为在池子里的已经是解码好的字符了，所以可以直接识别一行（有换行符），但不会读取换行符，所以输出时要自己写上换行符
	而普通的字符输入流是直接去外存读取数据，那里全是二进制数，所以只能一个一个字符或者按字符数组读取，
	字节输入流只能识别一个一个字节，就更不可能了
	
	新增方法：
	public String readLine()	读取一行数据返回，如果读取没有完毕，无行可读返回null
								注：网络模式是另外一段被close才返回null
	
	结论：
		读文本最优秀代码就是缓冲字符输入流！！！！
	 	1.因为readLine不需要创建字符数组桶（占内存），
		2.一些信息必须用行解析出来
		//admin123456
		//admin2123

   目标：学会使用缓冲字符输入流提高字符输入流的性能，新增了按照行读取的方法(经典代码)
 */
public class BufferedReader_Test1 {
    public static void main(String[] args) {
        try (
                // 1、创建一个文件字符输入流与源文件接通。
                Reader fr = new FileReader("src/data2.txt");
                // a、把低级的字符输入流包装成高级的缓冲字符输入流。
                BufferedReader br = new BufferedReader(fr);//真正包的是new FileReader，
        		//要使用独有功能readLine()所以不能用多态写      		//可以传Reader是多态写法，为了提高方法通用性
                ){

            // 2、用循环，每次读取一个字符数组的数据。  1024 + 1024 + 8
//            char[] buffer = new char[1024]; // 1K字符
//            int len;
//            while ((len = br.read(buffer)) != -1) {
//                String rs = new String(buffer, 0, len);
//                System.out.print(rs);
//            }
        	//io流独有风格：while循环外面定义变量
              String line;
              while ((line = br.readLine()) != null){//无行可读为止
                  System.out.println(line);//读完一行要自己换行，readLine读不到换行符
              }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
